/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetofinal;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.sql.ResultSet;
import java.sql.SQLDataException;
import java.sql.SQLException;
import java.text.DecimalFormat;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

/**
 *
 * @author Will
 */
public class CadastroCliente extends JInternalFrame {
    
    private final int preferedHeight = 28;
    
    private JPanel jpframe, jpmenu, jpfields;
    
    private JButton btnProcessar, btnNovo, btnExcluir, btnFechar, btnAjuda;
    private JLabel lblCodigoCliente, lblNomeCliente, lblEndereco, 
            lblEstadoCivil, lblSexo, lblAreasInteresse;
    private JTextField txCodigoCliente, txNomeCliente, txEndereco;
    private JComboBox cbEstadoCivil;
    private ButtonGroup bgroupsexo;
    private JRadioButton[] arrayRadio = new JRadioButton[2];
    private JCheckBox[] arrayCheckBox = new JCheckBox[3];
    
    //Define bordas em relevo caixa baixa para os JPanels internos
    private Border loweredEtched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
    
    //Layouts da página
    FlowLayout experimentLayout = new FlowLayout();
    
    //Variaveis que armazenam os valores que vem do banco
    private String vlCodigoBd = "", vlNomeBd = "", vlEnderecoBd = "", vlSexoBd = "";
    boolean vlArea1Bd = false, vlArea2Bd = false, vlArea3Bd = false;
    int vlEstCivilBd;
    
    public CadastroCliente(){
        initComponents(null);  
    }
    
    public CadastroCliente(String nmFrame){
        super(nmFrame);
        initComponents(null);
    }
    
    public CadastroCliente(String nmFrame, Object vlCodigo){
        super(nmFrame);
        initComponents(vlCodigo);
    }

    private void initComponents(Object vlCodigo) {
        setClosable(true);
        setMaximizable(true);
        setIconifiable(true);
        setResizable(true);
        setVisible(true);
        
        if(vlCodigo != null){
            BancoDados bd = new BancoDados();
            ResultSet rs = bd.pesquisaClientes(vlCodigo.toString(), "");
            try{
                while(rs.next()){
                   vlCodigoBd   = rs.getString("codigo");
                   vlNomeBd     = rs.getString("nome");
                   vlEnderecoBd = rs.getString("endereco");
                   vlSexoBd     = rs.getString("sexo");
                   vlEstCivilBd = rs.getInt("cod_est_civil");
                   vlArea1Bd    = rs.getBoolean("areas1");
                   vlArea2Bd    = rs.getBoolean("areas2");
                   vlArea3Bd    = rs.getBoolean("areas3");
                }
            }catch(SQLException sqlex){
                JOptionPane.showMessageDialog(null, sqlex.toString(), "Aviso", JOptionPane.WARNING_MESSAGE);
            }
        }
        
        //Cria um JPanel principal sem bordas para guardar o conteúdo da tela (container)
        jpframe = new JPanel();
        jpframe.setBorder(BorderFactory.createEmptyBorder(10, 10, 20, 10));
        BoxLayout bl = new BoxLayout(jpframe, BoxLayout.PAGE_AXIS);
        jpframe.setLayout(bl);
        
        //Cria um JPanel para alocar os componentes de menu da tela
        jpmenu = new JPanel();
        jpmenu.setLayout(experimentLayout);
        experimentLayout.setAlignment(FlowLayout.TRAILING);
        jpmenu.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        jpmenu.setBorder(loweredEtched);
        jpmenu.setVisible(true);
        
        //BOTÕES DO JPANEL MENU
        btnProcessar    = new JButton("Processar");
        
        btnProcessar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                BancoDados bd = new BancoDados();
                
                if(verificaCampos()){
                    String sexo;
                    int estCivil = cbEstadoCivil.getSelectedIndex();
                    if(arrayRadio[0].isSelected()){
                        sexo = "M";
                    }else{
                        sexo = "F";
                    }
                    
                    boolean[] areas = new boolean[3];
                    
                    areas[0] = arrayCheckBox[0].isSelected();
                    areas[1] = arrayCheckBox[1].isSelected();
                    areas[2] = arrayCheckBox[2].isSelected();
                    
                    if(txCodigoCliente.getText().trim().length() > 0){
                        int resInsert = bd.atualizaCliente(txCodigoCliente.getText().trim(), txNomeCliente.getText().trim(), 
                            txEndereco.getText().trim(), estCivil, sexo, areas[0], 
                            areas[1], areas[2]
                        );

                        if(resInsert != 0){
                            JOptionPane.showMessageDialog(null, "Registro alterado com sucesso!");
                        }else{
                            JOptionPane.showMessageDialog(null, "A inserção falhou", "Aviso", JOptionPane.WARNING_MESSAGE);
                        }
                    }else{
                        int resInsert = bd.insereClientes(txNomeCliente.getText().trim(), 
                            txEndereco.getText().trim(), estCivil, sexo, areas[0], 
                            areas[1], areas[2]
                        );

                        if(resInsert != 0){
                            JOptionPane.showMessageDialog(null, "Registro inserido com sucesso!");
                            DecimalFormat quatroDigitos = new DecimalFormat("0000");
                            String strAux = quatroDigitos.format(resInsert);
                            txCodigoCliente.setText(strAux);
                        }else{
                            JOptionPane.showMessageDialog(null, "A inserção falhou", "Aviso", JOptionPane.WARNING_MESSAGE);
                        }
                    }
                    
                }else{
                    JOptionPane.showMessageDialog(null, "Porfavor preencha os campos obrigatórios", "Aviso", JOptionPane.WARNING_MESSAGE);
                }
                
            }
        });
        
        btnNovo = new JButton("Novo");
        
        btnNovo.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                limparCampos();
            }
        });
        
        btnExcluir      = new JButton("Excluir");
        
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                
                int option = JOptionPane.showConfirmDialog(null, "Deseja realmente excluir este registro?");
                
                if(option == JOptionPane.YES_OPTION){
                    BancoDados bd = new BancoDados();
                    if(txCodigoCliente.getText().trim().length() > 0){
                            int resInsert = bd.deletaCliente(txCodigoCliente.getText().trim());

                            if(resInsert != 0){
                                JOptionPane.showMessageDialog(null, "Registro excluido com sucesso!");
                                limparCampos();
                            }else{
                                JOptionPane.showMessageDialog(null, "Erro ao deletar registro", "Aviso", JOptionPane.WARNING_MESSAGE);
                            }
                        }else{
                        JOptionPane.showMessageDialog(null, "Código inexistente para deleção", "Aviso", JOptionPane.WARNING_MESSAGE);
                    }
                }
            }
        });
        
        btnFechar       = new JButton("Fechar");
        
        btnFechar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        
        btnAjuda        = new JButton("Ajuda");
        
        btnAjuda.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String txAjuda, titleWindow;
                if(txCodigoCliente.getText().trim().length() > 0){
                    titleWindow = "Tela tela de edição do cliente";
                }else{
                    titleWindow = "Tela tela de cadastro do cliente";
                }
                
                txAjuda = "Botão Processar : Salva as informações do cliente.\n\n"
                            + "Botão Novo : Limpa os dados na tela para cadastrar um novo cliente.\n"
                            + "Botão Excluir : Exclui os dados do cliente do banco.\n"
                            + "Botão Fechar : Fecha a tela de edição do cliente.\n"
                            + "Botão Ajuda : Mostra as funcionalidades da tela.\n";
                JOptionPane.showMessageDialog(null, txAjuda, titleWindow, JOptionPane.INFORMATION_MESSAGE);
            }
        });
        
        jpmenu.add(btnAjuda);
        jpmenu.add(btnFechar);
        jpmenu.add(btnExcluir);
        jpmenu.add(btnNovo);
        jpmenu.add(btnProcessar);
        
        jpframe.add(jpmenu);
        
        //Adiciona um espaçamento entre os containers dentro do jpframe
        jpframe.add(Box.createRigidArea(new Dimension(0, 30)));
        
        lblCodigoCliente    = new JLabel("Código do cliente: ");
        lblNomeCliente      = new JLabel("Nome do cliente: ");
        lblEndereco         = new JLabel("Endereço: ");
        lblEstadoCivil      = new JLabel("Estado civil: ");
        lblSexo             = new JLabel("Sexo: ");
        lblAreasInteresse   = new JLabel("Áreas de interesse: ");
        
        txCodigoCliente = new JTextField();
        txCodigoCliente.setText(vlCodigoBd);
        txCodigoCliente.setEditable(false);
        txCodigoCliente.setPreferredSize(new Dimension(60, preferedHeight));
        
        txNomeCliente = new JTextField();
        txNomeCliente.setText(vlNomeBd);
        txNomeCliente.setPreferredSize(new Dimension(300, preferedHeight));
        
        txEndereco = new JTextField();
        txEndereco.setText(vlEnderecoBd);
        txEndereco.setPreferredSize(new Dimension(400, preferedHeight));
        
        cbEstadoCivil = new JComboBox();
        cbEstadoCivil.addItem("Solteiro");
        cbEstadoCivil.addItem("Casado");
        cbEstadoCivil.addItem("Divorciado");
        cbEstadoCivil.addItem("Viúvo");
        
        cbEstadoCivil.setSelectedIndex(vlEstCivilBd);
        
        arrayCheckBox[0] = new JCheckBox("Cultura");
        arrayCheckBox[0].setSelected(vlArea1Bd);
        arrayCheckBox[1] = new JCheckBox("Saúde"); 
        arrayCheckBox[1].setSelected(vlArea2Bd);
        arrayCheckBox[2] = new JCheckBox("Esportes");
        arrayCheckBox[2].setSelected(vlArea3Bd);
        
        jpfields = new JPanel();
        jpfields.setLayout(new GridBagLayout());
        jpfields.setBorder(loweredEtched);
        
        addLabelTextRows(lblCodigoCliente, txCodigoCliente, jpfields);
        addLabelTextRows(lblNomeCliente, txNomeCliente, jpfields);
        addLabelTextRows(lblEndereco, txEndereco, jpfields);
        addLabelComboRows(lblEstadoCivil, cbEstadoCivil, jpfields);
        
        bgroupsexo = new ButtonGroup();
        arrayRadio[0] = new JRadioButton("Masculino");
        arrayRadio[1] = new JRadioButton("Feminino");
        switch (vlSexoBd) {
            case "M":
                arrayRadio[0].setSelected(true);
                break;
            case "F":
                arrayRadio[1].setSelected(true);
                break;
            default:
                break;
        }
        
        addLabelRadioRows(lblSexo, arrayRadio, bgroupsexo, jpfields);
        addLabelCheckRows(lblAreasInteresse, arrayCheckBox, jpfields);
        
        jpframe.add(jpfields);
        
        getContentPane().add(jpframe);  
        pack();
    }
    
    /**
     * Função que adiciona uma linha com a label e um textfield ao container informado
     * @param label
     * @param textField
     * @param container 
     */
    private void addLabelTextRows(JLabel label,
                                  JTextField textField,
                                  Container container) {
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
        
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);

        c.gridwidth = GridBagConstraints.REMAINDER;     //end row
        c.anchor = GridBagConstraints.WEST;
        container.add(textField, c);
    }
    
    /**
     * Função que adiciona uma linha com a label e um combobox ao container informado
     * @param label
     * @param comboField
     * @param container 
     */
    private void addLabelComboRows(JLabel label,
                                  JComboBox comboField,
                                  Container container) {
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);

        c.gridwidth = GridBagConstraints.REMAINDER;     //end row
        c.anchor = GridBagConstraints.WEST;
        container.add(comboField, c);
    }
    
     /**
     * Função que adiciona uma linha com a label e os radioFields ao container informado
     * @param label
     * @param radioFields
     * @param btnGroup
     * @param container 
     */
    private void addLabelRadioRows(JLabel label,
                                  JRadioButton[] radioFields,
                                  ButtonGroup btnGroup,
                                  Container container) {
        //Criamos um novopainel que armazenara os radiobuttons
        JPanel jpContainer = new JPanel();
        GridBagLayout layoutContainer = new GridBagLayout();
        jpContainer.setLayout(layoutContainer);
        
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);

        for(int i = 0; i < radioFields.length; i++){
            btnGroup.add(radioFields[i]);
        }
        
        c.anchor = GridBagConstraints.WEST;
        for(int i = 0; i < radioFields.length; i++){
            jpContainer.add(radioFields[i]);
        }
        c.gridwidth = GridBagConstraints.REMAINDER; 
        c.anchor = GridBagConstraints.WEST;
        container.add(jpContainer, c);
    }
    
    /**
     * Função que adiciona uma linha com a label e os checkboxes ao container informado
     * @param label
     * @param checkBoxFields
     * @param container 
     */
    private void addLabelCheckRows(JLabel label,
                                  JCheckBox[] checkBoxFields,
                                  Container container) {
        //Criamos um novopainel que armazenara os checkboxes
        JPanel jpContainer = new JPanel();
        GridBagLayout layoutContainer = new GridBagLayout();
        jpContainer.setLayout(layoutContainer);
        
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);
        
        for(int i = 0; i < checkBoxFields.length; i++){
            jpContainer.add(checkBoxFields[i]);
        }
        
        c.gridwidth = GridBagConstraints.REMAINDER; //next-to-last
        c.anchor = GridBagConstraints.WEST;
        container.add(jpContainer, c);
    }
    
    public boolean verificaCampos(){
        boolean validaCampos = true;
        
        if(txNomeCliente.getText().trim().equals("") || txEndereco.getText().trim().equals("")){
            validaCampos = false;
        }
        
        return validaCampos;
    }
    
    public void limparCampos(){
        txCodigoCliente.setText("");
        txNomeCliente.setText("");
        txEndereco.setText("");
        cbEstadoCivil.setSelectedIndex(0);
        bgroupsexo.clearSelection();
        arrayCheckBox[0].setSelected(false);
        arrayCheckBox[1].setSelected(false);
        arrayCheckBox[2].setSelected(false);
    }
}
